[アップデート] Amazon VPC Flow LogsがTransit Gatewayをサポートしました
Transit Gatewayのログが見たいな
こんにちは、のんピ(@non____97)です。
皆さんはTransit Gatewayのログが見たいなと思ったことはありますか? 私はあります。
「VPC Flow Logsがあるじゃない」と思われるかもいるかもしれないですが、VPC内のログではなく、どのトラフィックがTransit Gatewayでどのようにルーティングされたかをログから確認したいのです。
そんな折、Amazon VPC Flow LogsがTransit Gatewayをサポートしたとアナウンスがありました。
AWS公式ブログも投稿されていますね。
早速調査してみたのでアップデート内容を紹介します。
いきなりまとめ
- Transit GatewayのログをS3もしくは、CloudWatch Logsに出力できる
- 基本的な使い勝手はVPCのVPC Flow Logsと同じ
- 取得できる情報がTransit Gateway attachmentなど異なる
- Deny / Allow のフィルターができないため、VPC及びオンプレミスネットワーク間で頻繁に通信が発生する場合はログ取得にかかる料金に注意
- APIやAWS CLIはVPCにVPC Flow Logsを設定するときと同じ
- クエリのパラメーターでTransit Gatewayを指定する
特徴
ユースケース
どのトラフィックがどのTransit Gateway attachmentからどのTransit Gateway attachmentに流れていったのかを簡単に確認することができるようになりました。
例えば、Direct Connect GatewayやSite-to-Site VPNとのTransit Gateway attachmentのログを確認すれば、オンプレミスネットワークとどのような種類のトラフィックが流れているのか簡単に把握することができます。
オンプレミスネットワークとの通信の場合、VPCのVPC Flow Logsでは「Transit Gateway attachmentに到達した or から来た」までしか分かりませんでした。今回のアップデートにより、「Transit Gatewayのどのアタッチメントにルーティングされたか」まで分かるようになりました。トラブルシューティングにもってこいですね。
Transit GatewayのVPC Flow LogsはS3もしくは、CloudWatch Logsに出力可能です。
出力したログに対してAthenaやQuickSight、SIEM on Amazon OS、CloudWatch Contributor Insightsなどを使えば、分析も捗ると思います。
なお、Transit GatewayのVPC Flow LogsはVPCのVPC Flow Logsとは異なり、Deny / Allow の概念がないため「許可された通信のみ」のようなフィルターはできません。そのため、VPC及びオンプレミスネットワーク間で頻繁に通信が発生する場合は、ログ取得の料金に注意が必要です。
どんなログが取れるの?
Transit GatewayのVPC Flow Logsで取得できる情報は以下の通りです。
フィールド | 説明 | バージョン |
---|---|---|
version | フィールドが導入されたバージョンを示す デフォルトのフォーマットは、すべてのバージョン2フィールドを、テーブルに表示されるのと同じ順序で含んでいる |
2 |
tgw-id | トラフィックが記録されているTransit GatewayのID | 6 |
tgw-attachment-id | トラフィックが記録されているTransit Gateway attachmentのID | 6 |
srcaddr | 受信トラフィックの送信元アドレス、またはTransit Gatewayの送信トラフィックのTransit GatewayのIPv4またはIPv6アドレス | 2 |
dstaddr | 送信トラフィックの宛先アドレス、またはTransit Gatewayの受信トラフィックのTransit GatewayのIPv4またはIPv6アドレス | 2 |
srcport | トラフィックの送信元ポート | 2 |
dstport | トラフィックの宛先ポート | 2 |
protocol | トラフィックのIANAプロトコル番号 | 2 |
packets | フロー中に転送されたパケットの数 | 2 |
bytes | フロー中に転送されたバイト数 | 2 |
start | フローの最初のパケットが集約間隔内に受信された時刻(Unix秒単位) パケットがTransit Gatewayで送信または受信されてから最大60秒かかる場合がある |
2 |
end | フローの最後のパケットが集約間隔内に受信された時刻(Unix秒単位) パケットがTransit Gatewayで送信または受信されてから最大60秒かかる場合がある |
2 |
packets-lost-no-route | 経路が指定されていないために失われたパケット | 6 |
packets-lost-blackhole | ブラックホールによって失われたパケット | 6 |
packets-lost-mtu-exceeded | サイズが MTU を超えたために失われたパケット | 6 |
packets-lost-ttl-expired | TTLの超過により失われたパケット | 6 |
tgw-src-vpc-account-id | トラフィックの送信元VPCのAWSアカウントID | 6 |
tgw-dst-vpc-account-id | トラフィックの送信先VPCのAWSアカウントID | 6 |
tgw-src-vpc-id | 送信元VPCのID | 6 |
tgw-dst-vpc-id | 送信先VPCのID | 6 |
tgw-src-subnet-id | 送信元トラフィックのTransit Gateway attachmentのサブネットのID | 6 |
tgw-dst-subnet-id | 送信先トラフィックのTransit Gateway attachmentのサブネットのID | 6 |
tgw-src-eni | 送信元トラフィックのTransit Gateway attachmentのENIのID | - |
tgw-dst-eni | 送信先トラフィックのTransit Gateway attachmentのENIのID | - |
tcp-flags | TCPフラグのビットマスク値 | 3 |
type | トラフィックの種類 | 3 |
region | トラフィックが記録されるTransit Gatewayのリージョン | 4 |
tgw-src-az-id | トラフィックが記録されている送信元Transit Gateway attachmentのAZのID | 6 |
tgw-dst-az-id | トラフィックが記録されている送信先Transit Gateway attachmentのAZのID | 6 |
tgw-pair-attachment-id | トラフィックの送信先もしくは送信元のTransit Gateway attachmentのID | - |
log-status | ロギングステータス | - |
flow-direction | トラフィックがキャプチャされるTransitGateway attachmentを基準としたフローの方向 | 5 |
pkt-src-aws-service | 送信元IPアドレスがAWSサービスの場合のsrcaddrのIPアドレス範囲のサブセットの名前 | 5 |
pkt-dst-aws-service | 送信先IPアドレスがAWSサービス用の場合のdstaddrフィールドのIPアドレス範囲のサブセットの名前 | 5 |
resource-type | Flow Logsリソースの種類 | 6 |
account-id | 送信元Transit Gatewayの所有者のAWSアカウントID | 2 |
参考 : Logging network traffic using Transit Gateway Flow Logs - Amazon VPC
バージョンが-
になっているものは、2022/7/15時点でAWS公式ドキュメントには記載はなかったフィールドです。ログの内容からどのようなフィールドか判断しました。ドキュメントに反映されるのを気長に待ちましょう。
設定方法は?
設定は簡単で、マネージメントコンソールの場合はTransit Gatewayを選択してVPCの時と同じようにFlow Logsを設定します。
AWS CLIやAPIもVPCにVPC Flow Logsを設定するときと同じです。クエリのパラメーターでTransit Gatewayを指定します。
例えば、create-flow-logsの場合は、--resource-type
にTransitGateway
もしくはTransitGatewayAttachment
を指定します。
やってみた
検証の構成
検証の構成は以下の通りです。
Transit GatewayのVPC Flow LogsをCloudWatch Logsに出力します。
Transit GatewayのVPC Flow Logsの設定
それでは、Transit GatewayのVPC Flow Logsの設定をします。
Transit GatewayのVPC Flow Logsのリソース以外はAWS CDKでデプロイしておきます。使用したコードは以下リポジトリに保存しています。
デプロイ後、AWS CLIでTransit Gateway attachmentとENIを確認しておきます。
# Transit Gateway attachmentの確認 $ aws ec2 describe-transit-gateway-attachments \ --filters Name=transit-gateway-id,Values=tgw-00df7ccffe7499669 { "TransitGatewayAttachments": [ { "TransitGatewayAttachmentId": "tgw-attach-0ef3bd9b8e903d23e", "TransitGatewayId": "tgw-00df7ccffe7499669", "TransitGatewayOwnerId": "<AWSアカウントID>", "ResourceOwnerId": "<AWSアカウントID>", "ResourceType": "vpc", "ResourceId": "vpc-04b7534a255f8e615", "State": "available", "Association": { "TransitGatewayRouteTableId": "tgw-rtb-0742b8c2d7577db02", "State": "associated" }, "CreationTime": "2022-07-15T05:09:20+00:00", "Tags": [ { "Key": "Name", "Value": "Transit Gateway attachment for VPC A" } ] }, { "TransitGatewayAttachmentId": "tgw-attach-0f61f249a2957f685", "TransitGatewayId": "tgw-00df7ccffe7499669", "TransitGatewayOwnerId": "<AWSアカウントID>", "ResourceOwnerId": "<AWSアカウントID>", "ResourceType": "vpc", "ResourceId": "vpc-0ad89adef4a35a569", "State": "available", "Association": { "TransitGatewayRouteTableId": "tgw-rtb-0742b8c2d7577db02", "State": "associated" }, "CreationTime": "2022-07-15T05:09:38+00:00", "Tags": [ { "Key": "Name", "Value": "Transit Gateway attachment for VPC B" } ] } ] } # VPC AのENIの確認 $ aws ec2 describe-network-interfaces \ --filters Name=vpc-id,Values=vpc-04b7534a255f8e615 { "NetworkInterfaces": [ { "Association": { "IpOwnerId": "amazon", "PublicDnsName": "ec2-54-80-234-195.compute-1.amazonaws.com", "PublicIp": "54.80.234.195" }, "Attachment": { "AttachTime": "2022-07-15T05:10:48+00:00", "AttachmentId": "eni-attach-0aa99d34915b2dbde", "DeleteOnTermination": true, "DeviceIndex": 0, "NetworkCardIndex": 0, "InstanceId": "i-050d437da9aca3217", "InstanceOwnerId": "<AWSアカウントID>", "Status": "attached" }, "AvailabilityZone": "us-east-1a", "Description": "", "Groups": [ { "GroupName": "TgwStack-VPCAEC2InstanceSG6644E55D-A694RBJN5MSA", "GroupId": "sg-0091fe96aebf7e3e9" } ], "InterfaceType": "interface", "Ipv6Addresses": [], "MacAddress": "0e:43:3e:65:c7:9f", "NetworkInterfaceId": "eni-099fbf827b3a9bda9", "OwnerId": "<AWSアカウントID>", "PrivateDnsName": "ip-10-0-1-8.ec2.internal", "PrivateIpAddress": "10.0.1.8", "PrivateIpAddresses": [ { "Association": { "IpOwnerId": "amazon", "PublicDnsName": "ec2-54-80-234-195.compute-1.amazonaws.com", "PublicIp": "54.80.234.195" }, "Primary": true, "PrivateDnsName": "ip-10-0-1-8.ec2.internal", "PrivateIpAddress": "10.0.1.8" } ], "RequesterManaged": false, "SourceDestCheck": true, "Status": "in-use", "SubnetId": "subnet-0d36c9766ce73a692", "TagSet": [], "VpcId": "vpc-04b7534a255f8e615" }, { "Attachment": { "AttachmentId": "ela-attach-0085156eedfcaa199", "DeleteOnTermination": false, "DeviceIndex": 1, "InstanceOwnerId": "amazon-aws", "Status": "attached" }, "AvailabilityZone": "us-east-1a", "Description": "Network Interface for Transit Gateway Attachment tgw-attach-0ef3bd9b8e903d23e", "Groups": [], "InterfaceType": "transit_gateway", "Ipv6Addresses": [], "MacAddress": "0e:83:76:e4:ff:33", "NetworkInterfaceId": "eni-0a6667e3a8907f6ad", "OwnerId": "<AWSアカウントID>", "PrivateDnsName": "ip-10-0-1-24.ec2.internal", "PrivateIpAddress": "10.0.1.24", "PrivateIpAddresses": [ { "Primary": true, "PrivateDnsName": "ip-10-0-1-24.ec2.internal", "PrivateIpAddress": "10.0.1.24" } ], "RequesterId": "936118442230", "RequesterManaged": false, "SourceDestCheck": false, "Status": "in-use", "SubnetId": "subnet-0dae8cebfb7adebb3", "TagSet": [], "VpcId": "vpc-04b7534a255f8e615" } ] } # VPC BのENIの確認 $ aws ec2 describe-network-interfaces \ --filters Name=vpc-id,Values=vpc-0ad89adef4a35a569 { "NetworkInterfaces": [ { "Association": { "IpOwnerId": "amazon", "PublicDnsName": "ec2-3-85-109-13.compute-1.amazonaws.com", "PublicIp": "3.85.109.13" }, "Attachment": { "AttachTime": "2022-07-15T05:10:48+00:00", "AttachmentId": "eni-attach-0de94693afa9d6dca", "DeleteOnTermination": true, "DeviceIndex": 0, "NetworkCardIndex": 0, "InstanceId": "i-081ad3820b4877273", "InstanceOwnerId": "<AWSアカウントID>", "Status": "attached" }, "AvailabilityZone": "us-east-1a", "Description": "", "Groups": [ { "GroupName": "TgwStack-VPCBEC2InstanceSG420D90C0-KC3YX4ICX4UL", "GroupId": "sg-08e79665402a3c626" } ], "InterfaceType": "interface", "Ipv6Addresses": [], "MacAddress": "0e:c3:0f:d4:9c:1f", "NetworkInterfaceId": "eni-025ac6949e24ee9b3", "OwnerId": "<AWSアカウントID>", "PrivateDnsName": "ip-10-0-2-6.ec2.internal", "PrivateIpAddress": "10.0.2.6", "PrivateIpAddresses": [ { "Association": { "IpOwnerId": "amazon", "PublicDnsName": "ec2-3-85-109-13.compute-1.amazonaws.com", "PublicIp": "3.85.109.13" }, "Primary": true, "PrivateDnsName": "ip-10-0-2-6.ec2.internal", "PrivateIpAddress": "10.0.2.6" } ], "RequesterManaged": false, "SourceDestCheck": true, "Status": "in-use", "SubnetId": "subnet-09765604677404d2a", "TagSet": [], "VpcId": "vpc-0ad89adef4a35a569" }, { "Attachment": { "AttachmentId": "ela-attach-0a2f734610f0cae51", "DeleteOnTermination": false, "DeviceIndex": 1, "InstanceOwnerId": "amazon-aws", "Status": "attached" }, "AvailabilityZone": "us-east-1a", "Description": "Network Interface for Transit Gateway Attachment tgw-attach-0f61f249a2957f685", "Groups": [], "InterfaceType": "transit_gateway", "Ipv6Addresses": [], "MacAddress": "0e:e4:51:df:0a:03", "NetworkInterfaceId": "eni-0a656e2b79bb80c54", "OwnerId": "<AWSアカウントID>", "PrivateDnsName": "ip-10-0-2-27.ec2.internal", "PrivateIpAddress": "10.0.2.27", "PrivateIpAddresses": [ { "Primary": true, "PrivateDnsName": "ip-10-0-2-27.ec2.internal", "PrivateIpAddress": "10.0.2.27" } ], "RequesterId": "936118442230", "RequesterManaged": false, "SourceDestCheck": false, "Status": "in-use", "SubnetId": "subnet-0f259fbeea4217fa4", "TagSet": [], "VpcId": "vpc-0ad89adef4a35a569" } ] }
各リソースのID及びIPアドレスは以下の通りです。
リソース | ID or IPアドレス |
---|---|
Transit Gateway ID | tgw-00df7ccffe7499669 |
VPC A ID | vpc-04b7534a255f8e615 |
VPC B ID | vpc-0ad89adef4a35a569 |
VPC A の Transit Gateway attachment ID | tgw-attach-0ef3bd9b8e903d23e |
VPC B の Transit Gateway attachment ID | tgw-attach-0f61f249a2957f685 |
VPC A の Transit Gateway attachment の ENI ID | eni-0a6667e3a8907f6ad |
VPC B の Transit Gateway attachment の ENI ID | eni-0a656e2b79bb80c54 |
VPC A の Transit Gateway attachment の IPアドレス | 10.0.1.24 |
VPC B の Transit Gateway attachment の IPアドレス | 10.0.2.27 |
VPC A の EC2インスタンス のIP アドレス | 10.0.1.8 |
VPC B の EC2インスタンス のIP アドレス | 10.0.2.6 |
それでは、Transit GatewayにVPC Flow Logsの設定をしてあげます。
Transit Gatewayを選択し、フローログ
タブのフローログを作成
をクリックします。
送信先はCloudWatch Logsを指定します。送信先ロググループとIAMロールはAWS CDKで作成したものを指定します。
ちなみに、IAMロールのポリシー及び、信頼されたエンティティは以下の通りです。
- ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Action": "iam:PassRole", "Resource": "arn:aws:iam::<AWSアカウントID>:role/TgwStack-FlowLogsIAMRole0408C8AF-1ADCDDN69YBSX", "Effect": "Allow" }, { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:TgwStack-FlowLogsLogGroupFA35AB6F-a8JHrqa7si62:*", "Effect": "Allow" } ] }
-
信頼されたエンティティ
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "vpc-flow-logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
VPC Flow Logsの設定が完了すると、以下のように表示されます。VPCにVPC Flow Logsを設定した時と同じですね。
ロググループを確認します。Transit Gateway attachmentごとにログストリームが作成されています。
動作確認
それではログが出力されるか確認してみます。
まず、VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してpingを叩いてみます。
$ ping ip-10-0-2-6.ec2.internal -c 5 PING ip-10-0-2-6.ec2.internal (10.0.2.6) 56(84) bytes of data. 64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=1 ttl=254 time=1.88 ms 64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=2 ttl=254 time=0.494 ms 64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=3 ttl=254 time=0.536 ms 64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=4 ttl=254 time=0.658 ms 64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=5 ttl=254 time=0.547 ms --- ip-10-0-2-6.ec2.internal ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4070ms rtt min/avg/max/mdev = 0.494/0.824/1.889/0.536 ms
1分ほど待つと以下のように各ログストリームにログが出力されました。
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e - - - - - - - - - - - - - - - - - - 1657862234 1657862264 NODATA - 0 0 0 0 - us-east-1 - - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 egress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e - - - - - - - - - - - - - - - - - - 1657862234 1657862264 NODATA - 0 0 0 0 - us-east-1 - - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 egress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 ingress - -
protocol
のフィールドが1
になっていることから、ICMPのトラフィックであることが分かります。各Transit Gateway attachmentでEcho RequestとEcho Replyのトラフィックが記録されています。
protocol
の値に対応するプロトコルは以下、IANAのサイトからご確認ください。
packets
もpingで指定した5
になっていますね。bytes
も1回のEcho Requestにつき84バイトを送信しているので、は5 × 84 = 420
になっています。
なお、それぞれの一行目のログはNODATA
となっていることから、集約間隔内にトラフィックが流れなかった際のログです。
tcp/22にアクセスした際のログも確認してみましょう
VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してcurlでtcp/22でアクセスしてみます。
$ curl -v telnet://ip-10-0-2-6.ec2.internal:22 * Trying 10.0.2.6:22... * Connected to ip-10-0-2-6.ec2.internal (10.0.2.6) port 22 (#0) SSH-2.0-OpenSSH_7.4 ^C
1分ほど待つと以下のログが出力されました。
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 22 56840 6 3 185 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 egress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 56840 22 6 5 268 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 56840 22 6 5 268 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 egress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 22 56840 6 3 185 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 ingress - -
protocol
のが3
(tcp)で、srcport
やdstport
が22
になっていることから確かにtcp/22のアクセスが記録されています。
tcp/80にもアクセスしてみます。
VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してcurlを叩いてみます。
$ curl -m 5 ip-10-0-2-6.ec2.internal curl: (7) Failed to connect to ip-10-0-2-6.ec2.internal port 80 after 30 ms: Connection refused
ログは以下の通りです。
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 58872 80 6 1 60 1657873373 1657873373 OK IPv4 0 0 0 0 2 us-east-1 ingress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 80 58872 6 1 40 1657873373 1657873373 OK IPv4 0 0 0 0 - us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 80 58872 6 1 40 1657873373 1657873373 OK IPv4 0 0 0 0 - us-east-1 ingress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 58872 80 6 1 60 1657873373 1657873373 OK IPv4 0 0 0 0 2 us-east-1 egress - -
protocol
のが3
(tcp)で、srcport
やdstport
が80
になっていることから確かにtcp/80が記録されています。また、VPC BのEC2インスタンスではtcp/80でLISTENしていません。そのため、リクエストのtcp-flags
が2
(SYN)に対して、レスポンスのtcp-flags
は-
になっています。
最後にTransit GatewayのMTU以上のパケットを送信してみた時の挙動を確認してみます。
EC2インスタンスのMTUは9001です。
$ ip link show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 0e:43:3e:65:c7:9f brd ff:ff:ff:ff:ff:ff
一方、Transit GatewayのMTUは8500です。
ネットワーク接続の最大送信単位 (MTU) とは、接続を介して渡すことができる最大許容パケットサイズ (バイト単位) です。接続の MTU が大きいほど、より多くのデータを単一のパケットで渡すことができます。Transit Gateway は、VPC、Direct Connect ゲートウェイ、およびピアリングアタッチメント間のトラフィックに対して 8500 バイトの MTU をサポートします。VPN 接続を介したトラフィックは、1500 バイトの MTU を持つことができます。
今回は、8000と8600のパケットサイズを送りつけたときの挙動を確認します。
# パケットサイズ8000の場合 $ sudo ping ip-10-0-2-6.ec2.internal -s 8000 -f -c 5 PING ip-10-0-2-6.ec2.internal (10.0.2.6) 8000(8028) bytes of data. --- ip-10-0-2-6.ec2.internal ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3ms rtt min/avg/max/mdev = 0.696/0.774/1.050/0.140 ms, ipg/ewma 0.812/0.907 ms # パケットサイズ8600の場合 sh-4.2$ sudo ping ip-10-0-2-6.ec2.internal -s 8600 -f -c 5 PING ip-10-0-2-6.ec2.internal (10.0.2.6) 8600(8628) bytes of data. ..... --- ip-10-0-2-6.ec2.internal ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 64ms
パケットサイズ8600の場合は、全てロストしていますね。
ログは以下の通りです。
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 ingress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 ingress - - 6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 egress - -
パケットサイズ8600のトラフィックは記録されませんでした。packets-lost-mtu-exceeded
に記録されると思いましたが、そう言うわけではなさそうです。
トラブルシューティングに大助かり
Amazon VPC Flow LogsがTransit Gatewayをサポートしたアップデートを紹介しました。
Transit Gatewayが絡むトラブルシューティングに大助かりな機能だと思います。Transit Gateway attachmentやTransit Gateway route tableが多くなると混乱することも多くなりがちです。思った通りの通信ができないなと思ったらTransit GatewayでFlow Logsの作成をしてみてはいかがでしょうか。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!